package com.bnd.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 存储单位转换工具类
 */
public class StorageUnitUtil {

    /**
     * 将字节转换为带一位小数的MB单位字符串
     *
     * @param bytes 字节数
     * @return 格式化后的MB字符串，例如 "1.5 MB"
     */
    public static String bytesToMB(long bytes) {
        if (bytes < 0) {
            throw new IllegalArgumentException("字节数不能为负数");
        }
        
        // 1 MB = 1024 * 1024 bytes
        BigDecimal mb = new BigDecimal(bytes).divide(new BigDecimal(1024 * 1024), 1, RoundingMode.HALF_UP);
        return mb.toString() + " MB";
    }

    /**
     * 将字节转换为带一位小数的KB单位字符串
     *
     * @param bytes 字节数
     * @return 格式化后的KB字符串，例如 "102.4 KB"
     */
    public static String bytesToKB(long bytes) {
        if (bytes < 0) {
            throw new IllegalArgumentException("字节数不能为负数");
        }
        
        // 1 KB = 1024 bytes
        BigDecimal kb = new BigDecimal(bytes).divide(new BigDecimal(1024), 1, RoundingMode.HALF_UP);
        return kb.toString() + " KB";
    }

    /**
     * 智能转换字节单位，根据大小自动选择合适的单位（B/KB/MB/GB）
     *
     * @param bytes 字节数
     * @return 格式化后的字符串，例如 "1.2 MB", "512.0 KB", "1024 B"
     */
    public static String bytesToSmartUnit(long bytes) {
        if (bytes < 0) {
            throw new IllegalArgumentException("字节数不能为负数");
        }
        
        if (bytes < 1024) {
            return bytes + " B";
        } else if (bytes < 1024 * 1024) {
            BigDecimal kb = new BigDecimal(bytes).divide(new BigDecimal(1024), 1, RoundingMode.HALF_UP);
            return kb.toString() + " KB";
        } else if (bytes < 1024 * 1024 * 1024L) {
            BigDecimal mb = new BigDecimal(bytes).divide(new BigDecimal(1024 * 1024), 1, RoundingMode.HALF_UP);
            return mb.toString() + " MB";
        } else {
            BigDecimal gb = new BigDecimal(bytes).divide(new BigDecimal(1024 * 1024 * 1024L), 1, RoundingMode.HALF_UP);
            return gb.toString() + " GB";
        }
    }
}
